home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / misc~1 / 1 / mushroom.c < prev    next >
Encoding:
Text File  |  1985-11-19  |  10.0 KB  |  381 lines

  1.  
  2. *********************************************************
  3. *** MUSHROOM.TOS by Silas Warner, MicroProse Software ***
  4. *********************************************************
  5. *    This is the source for a program
  6. *    that interprets the "post-mortem
  7. *    buffer" that the Atari ST creates
  8. *    when the system crashes. This
  9. *    buffer is saved through RESETS
  10. *    until you turn the computer off.
  11. *    Press RESET and use this program
  12. *    when the screen fills with
  13. *    "mushrooms" and the computer dies.
  14. *
  15.  
  16. *To assemble this program, type
  17. *AS68 -l MUSHROOM.S
  18. *LINK68 MUSHROOM
  19. *RELMOD MUSHROOM.68K MUSHROOM.TOS
  20. *then remove MUSHROOM.O and MUSHROOM.68K.
  21.  
  22. *APSTART chunk to set stack and memory
  23. start  bra start1
  24.  
  25. title  dc.b 27,72,"+-------------------------------------+"
  26.   dc.b 13,10,"!       THE MUSHROOM ANALYZER         !"
  27.   dc.b 13,10,"! by Silas Warner,MicroProse Software !"
  28.   dc.b 13,10,"+-------------------------------------+"
  29.   dc.b 13,10,0
  30.   even
  31.  
  32. start1  move.l sp,a5
  33.   move.l #ustk,sp 
  34.   move.l 4(a5),a5
  35.   move.l $c(a5),d0
  36.   add.l $14(a5),d0
  37.   add.l $1c(a5),d0
  38.   add.l #$100,d0
  39.   move.l d0,-(sp) *set up m-f call
  40.   move.l a5,-(sp)
  41.   move.w #0,-(sp)
  42.   move.w #$4a,-(sp)
  43.   trap #1    *do m-f call
  44.   addq.l #4,sp
  45.   move.l (sp)+,a5    *recover basepage
  46.   addq.l #4,sp
  47. *NOW THE PROGRAM STARTS
  48.   lea.l start(pc),a5  *set PBR
  49.    lea.l ustk,sp  *use our own stack
  50. *Okay, grab mushroom buffer!
  51. startup  lea.l title,a0  *Found above
  52.   jsr wstring
  53.   jsr supmode  *Slam into super mode
  54.   move.l #$380,a0  *recover the mushroom save area
  55.   lea.l savest,a1  *to our own area for examination
  56. msurup  move.l (a0)+,(a1)+ *Move it fast and long
  57.   cmpa.l #saveend,a1
  58.   bne msurup  
  59.   jsr usrmode  *Now back to user mode
  60.   move.l savest,d0 *Is there a mushroom in memory?
  61.   cmp.l #$12345678,d0 *Magic number set by Atari
  62.   beq wasmush  *Is there a mushroom?
  63.   lea.l nomush,a0  *"NO MUSHROOM IN MEMORY"
  64.   jsr wstring
  65. progwat  lea.l presret,a0 *"--Press RETURN--"
  66.   jsr wstring
  67.   jsr rdchar  *wait for a RETURN key.
  68.   cmp.b #$0d,d0  *Is it RETURN?
  69.   bne progwat  *Nope, try again.
  70. progend  clr.w -(sp)  *end program
  71.   trap #1    *we gone!
  72. wasmush  lea.l mushtit,a0 * "LAST MUSHROOM WAS #"
  73.   jsr wstring
  74.   move.b saveex,d1 *Exception #
  75.   jsr hexbyte  *Print it
  76.   move.b #":",d1
  77.   jsr wrchar
  78.   lea.l errtbl,a0  *Interpret error
  79.   move.b saveex,d1 *Using lower byte of exception #
  80. errloop  move.b (a0)+,d0  *lower limit
  81.   move.b (a0)+,d2  *upper limit
  82.   cmp.b d1,d0  *Below lower limit?
  83.   bhi errskip  *Yes, skip it
  84.   cmp.b d1,d2  *Below or = upper limit?
  85.   bcc errprnt  *Yes, print it
  86. errskip  tst.b (a0)+  *skip to zero byte
  87.   bne errskip
  88.   beq errloop  *and try next entry
  89. errprnt  jsr wstring  *print message!
  90.   lea.l mushreg,a0  *"  Registers"
  91.   jsr wstring
  92.   clr.l d7  *d7 is register #
  93. dline  lea.l mushdr,a0 *" d"
  94.   jsr wstring
  95.   move.b d7,d1  *print reg #
  96.   or.b #"0",d1
  97.   jsr wrchar
  98.   move.b #"=",d1
  99.   jsr wrchar
  100.   move.l d7,d2  *Get reg
  101.   asl.w #2,d2  *indexed by longword
  102.   lea.l saved0,a0  *from saved D-regs
  103.   move.l 0(a0,d2.w),d1
  104.   jsr hexlong  *and print it
  105.   lea.l mushar,a0  *  a"
  106.   jsr wstring
  107.   move.b d7,d1  *print reg #
  108.   or.b #"0",d1
  109.   jsr wrchar
  110.   move.b #"=",d1
  111.   jsr wrchar
  112.   move.l d7,d2  *Get reg
  113.   asl.w #2,d2  *Indexed by longword
  114.   lea.l savea0,a0  *from saved A-regs
  115.   move.l 0(a0,d2.w),d1
  116.   jsr hexlong  *and print it
  117.   addq.l #1,d7  *go to next reg index
  118.   cmp.b #8,d7  *All regs done?
  119.   bne dline  *No, loop back
  120.   move.w saveex+2,d3 *get saved CCR
  121.   lea.l flagm,a0  *Start to print flags
  122.   jsr wstring
  123.   lea traoff,a0  *Trace flag
  124.   btst #15,d3
  125.   beq traprt
  126.   lea traon,a0
  127. traprt  jsr wstring
  128.   jsr dospace
  129.   lea.l supoff,a0  *User/Super flag
  130.   btst #13,d3
  131.   beq supprt
  132.   lea supon,a0
  133. supprt  jsr wstring
  134.   jsr dospace
  135.   lea negoff,a0  *N flag
  136.   btst #3,d3
  137.   beq negprt
  138.   lea negon,a0
  139. negprt  jsr wstring
  140.   lea zeroff,a0  *Z flag
  141.   btst #2,d3
  142.   beq zerprt
  143.   lea zeron,a0
  144. zerprt  jsr wstring
  145.   jsr dospace
  146.   lea extoff,a0  *X flag
  147.   btst #4,d3
  148.   beq extprt
  149.   lea exton,a0
  150. extprt  jsr wstring
  151.   jsr dospace
  152.   lea ovroff,a0  *V flag
  153.   btst #1,d3
  154.   beq ovrprt
  155.   lea ovron,a0
  156. ovrprt  jsr wstring
  157.   jsr dospace
  158.   lea.l caroff,a0  *C flag
  159.   btst #0,d3
  160.   beq carprt
  161.   lea.l caron,a0
  162. carprt  jsr wstring
  163.   lea.l mushstk,a0 *"STACKS:User="
  164.   jsr wstring
  165.   move.l saveusp,d1 *User stack ptr
  166.   jsr hexlong  *print it
  167.   lea.l mushst2,a0 *    Super="
  168.   jsr wstring
  169.   move.l savea7,d1  *Super stack ptr
  170.   jsr hexlong  *Print it
  171.   lea.l savestk,a4 *start to print stack
  172.   move.l savea7,a3 *with loc it came from
  173. savestl  jsr newline
  174.   move.l a3,d1  *Saved stack addr
  175.   jsr hexlong  *Print it
  176.   move.b #":",d1
  177.   jsr wrchar
  178.   jsr dospace
  179.   move.l (a4)+,d1  *Saved stack contents
  180.   jsr hexlong  *Print it
  181.   addq.l #4,a3  *Inc stack address
  182.   cmpa.l #saveend,a4 *We at end of saved stack?
  183.   bne savestl  *Nope, back for more
  184.   jmp progwat  *Go back and wait for RETURN
  185.  
  186. *print a hex word to screen or printer
  187. hexlong  move.l d1,-(sp)
  188.   swap d1
  189.   jsr hexword
  190.   move.l (sp)+,d1
  191. hexword  move.w d1,-(sp)  *thanks to Jez San
  192.   lsr.w #8,d1
  193.   lsr.w #4,d1
  194.   bsr.s hxpnibbl  *1st nybble
  195.   move.w (sp),d1
  196.   lsr.w #8,d1
  197.   bsr.s hxpnibbl  *2nd nybble
  198.   move.w (sp)+,d1
  199. hexbyte  move.w d1,-(sp)
  200.   lsr.w #4,d1
  201.   bsr.s hxpnibbl  *3rd nybble
  202.   move.w (sp)+,d1
  203. hxpnibbl
  204.   and.w #15,d1  *finally print out ONE hex digit!
  205.   cmp.b #9,d1
  206.   bls.s hxpnib2
  207.   add.b #7,d1
  208. hxpnib2  add.b #"0",d1
  209.   bra wrchar
  210.  
  211. *getchar - Get key without echo and without waiting!
  212. *          Exit, d0.b is key, or zero if no key ready
  213. getchar  movem.l a0-a6/d1-d7,-(sp)
  214.   move.w #$0b,-(sp)
  215.   trap #1
  216.   addq.l #2,sp
  217.   tst.l d0  *is there a key?
  218.   bmi.s rdchq
  219.   movem.l (sp)+,a0-a6/d1-d7
  220.   clr.l d0  NO,return zero
  221.   rts
  222.  
  223. *rdchar  - Wait fpr a key (no echo)
  224. *          Exit, d0.b is key
  225. rdchar  movem.l a0-a6/d1-d7,-(sp)
  226. rdchq  move.w #$07,-(sp)
  227.   trap #1    *call DOS which returns 2 bytes
  228.   addq.l #2,sp  *in lower & upper word of d0
  229.   movem.l (sp)+,a0-a6/d1-d7
  230.   tst.w d0  *is lower word zero?
  231.   bne tsttop  *no, return upper word
  232. lswap  swap d0    *get upper if zero
  233. rdora  or.b #$80,d0  *set high bit
  234. rdout  and.l #$ff,d0  *of lower byte only!
  235. rdrts  rts    *and return
  236. tsttop  swap d0    *lower word nonzero
  237.   cmp.w #$44,d0  *if upper out of range
  238.   bcs bswap  *go to swap lower back
  239.   cmp.w #$54,d0  *same if above range
  240.   bls lswap  *if in range lower word or #$80
  241. bswap  swap d0    *if out of range, lower word!
  242.   bra rdout
  243.  
  244. *wstring - Print a string to the screen (up to zero byte)
  245. *          Entry, a0 =address of string
  246. wstring  movem.l a1-a6/d0-d7,-(sp)
  247.   move.l a0,-(sp)
  248.   move.w #$09,-(sp)
  249.   trap #1
  250.   addq.l #2,sp
  251.   move.l (sp)+,a0
  252.   movem.l (sp)+,a1-a6/d0-d7
  253.   rts
  254.  
  255. *dospace - Print one space
  256. *          Exit, d1 = #32 (SPACE)
  257. dospace  move.w #32,d1  *and fall thru to
  258.  
  259. *wrchar  - Print a character to the screen
  260. *          Entry, d1 =character to print
  261. wrchar  movem.l d0-d7/a0-a6,-(sp)
  262.   move.w d1,-(sp)
  263.   move.w #2,-(sp)
  264.   trap #1
  265.   addq.l #4,sp
  266.   movem.l (sp)+,d0-d7/a0-a6
  267.   rts
  268.  
  269. *newline - Print a CR and LF
  270. *          Exit, d1 = #10 (LF)
  271. newline  move.w #13,d1
  272.   bsr wrchar
  273.   move.w #10,d1
  274.   bra wrchar
  275.  
  276. supstak  dc.l 0
  277.  
  278. *Slip into super mode to get system vars
  279. supmode  movem.l a0-a6/d0-d7,-(sp)  *save regs
  280.   tst.l supstak  *Has supmode been called?
  281.   bne superet  *You ARE in sup mode, turkey!
  282.   clr.l -(sp)
  283.   move.w #32,-(sp)
  284.   trap #1    *call the supertrap
  285.   move.l d0,supstak *and save systack
  286.   addq.l #6,sp  *correct stack ptr
  287. superet  movem.l (sp)+,a0-a6/d0-d7  *restore regs
  288.   rts
  289.  
  290. *Return from super mode to user mode
  291. usrmode  movem.l a0-a6/d0-d7,-(sp)  *save regs
  292.   tst.l supstak  *Has supmode been called?
  293.   beq useret  *You ARE in user mode, fool!
  294.   move.l supstak,-(sp)
  295.   move.w #32,-(sp)
  296.   trap #1    *call the supertrap
  297.   clr.l supstak  *clear the systack save
  298.   addq.l #6,sp  *correct stack ptr
  299. useret  movem.l (sp)+,a0-a6/d0-d7  *restore regs
  300.   rts
  301.  
  302. *DATA segment
  303.   .data
  304. nomush  dc.b 13,10,"NO MUSHROOMS IN MEMORY!"
  305.   dc.b 13,10,0
  306. mushtit  dc.b "LAST MUSHROOM:#",0
  307. mushat  dc.b " AT ",0
  308. mushreg  dc.b 13,10,"       Registers        ",0
  309. mushdr  dc.b 13,10," d",0
  310. mushar  dc.b "  a",0
  311. mushstk  dc.b 13,10,"Stacks: User=",0
  312. mushst2  dc.b " Super=",0
  313. errtbl  dc.b 0,0,"Reset ROM destroyed!",0
  314.   dc.b 1,1,"Processor Error!",0
  315.   dc.b 2,2,"Bus Error.",0
  316.   dc.b 3,3,"Address Error.",0
  317.   dc.b 4,4,"Illegal Instruction.",0
  318.   dc.b 5,5,"Divide by Zero.",0
  319.   dc.b 6,6,"CHK Out of Bounds.",0
  320.   dc.b 7,7,"Overflow Trap.",0
  321.   dc.b 8,8,"Super-Mode Violation.",0
  322.   dc.b 9,9,"Trace Not On.",0
  323.   dc.b 10,10,"Line-A Code Clobbered.",0
  324.   dc.b 11,11,"Line-F Code Clobbered.",0
  325.   dc.b 12,14,"Unknown Interrupt.",0
  326.   dc.b 15,15,"Bad Interrupt Vector.",0
  327.   dc.b 16,23,"Unknown Interrupt.",0
  328.   dc.b 24,24,"Spurious Interrupt.",0
  329.   dc.b 25,31,"Hardware Interrupt.",0
  330.   dc.b 32,47,"Unknown TRAP.",0
  331.   dc.b 48,63,"Unknown Interrupt.",0
  332.   dc.b 64,255,"Interrupt Instruction.",0
  333. flagm  dc.b 13,10,"Flags:"
  334. traoff  dc.b "   ",0
  335. traon  dc.b "Trc",0
  336. supoff  dc.b "Usr",0
  337. supon  dc.b "Sup",0
  338. extoff  dc.b "Xc",0
  339. exton  dc.b "Xs",0
  340. negoff  dc.b "+",0
  341. negon  dc.b "-",0
  342. zeroff  dc.b " ",0
  343. zeron  dc.b "0",0
  344. ovroff  dc.b "Vc",0
  345. ovron  dc.b "Vs",0
  346. caroff  dc.b "Cc",0
  347. caron  dc.b "Cs",0
  348. presret  dc.b 13,10,"--Press RETURN.--",0
  349.   even
  350.  
  351. *BSS segment
  352.   .bss
  353.   even
  354.   ds.l 256 *256 stacks
  355. ustk  ds.l 1
  356. savest  ds.l 1  *must be $12345678
  357. saved0  ds.l 1  *D regs begin here
  358. saved1  ds.l 1
  359. saved2  ds.l 1
  360. saved3  ds.l 1
  361. saved4  ds.l 1
  362. saved5  ds.l 1
  363. saved6  ds.l 1
  364. saved7  ds.l 1
  365. savea0  ds.l 1  *A regs begin here
  366. savea1  ds.l 1
  367. savea2  ds.l 1
  368. savea3  ds.l 1
  369. savea4  ds.l 1
  370. savea5  ds.l 1
  371. savea6  ds.l 1
  372. savea7  ds.l 1
  373. saveex  ds.l 1  *exception #, long-255
  374. saveusp  ds.l 1  *usp
  375. savestk  ds.l 8  *stack popped
  376. saveend  ds.l 1  *end of save area
  377.   even
  378.  
  379. *********************
  380.   end
  381. əəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəə